标签		操作    		正常模式                        插入模式 

[tab移动]
            map <leader>tn :tabnext<cr>
            map <leader>tp :tabprevious<cr>
            map <leader>tf :tabfirst<cr>
            map <leader>tf :tablast<cr>
            map <leader>tt :tabnew<cr>
            map <leader>ta :tabonly<cr>
            map <leader>to :tabonly<cr>
            map <leader>td :tabclose<cr>
            map <leader>tm :tabmove 
            map <leader>te :tabedit <c-r>=expand("%:p:h")<cr>/   " Opens a new tab with the current buffer's path 
            noremap <silent><tab>n :tabn<cr>
            noremap <silent><tab>p :tabp<cr>
            noremap <silent><leader>t :tabnew<cr>
            noremap <silent><leader>1 :tabn 1<cr>
            noremap <silent><leader>2 :tabn 2<cr>
            noremap <silent><leader>3 :tabn 3<cr>
            noremap <silent><leader>4 :tabn 4<cr>
            noremap <silent><leader>5 :tabn 5<cr>
            noremap <silent><leader>6 :tabn 6<cr>
            noremap <silent><leader>7 :tabn 7<cr>
            noremap <silent><leader>8 :tabn 8<cr>
            noremap <silent><leader>9 :tabn 9<cr>
            noremap <silent><leader>0 :tabn 10<cr>

[窗口切换]
            map <C-j> <C-W>j
            map <C-k> <C-W>k
            map <C-h> <C-W>h
            map <C-l> <C-W>l

[buffer操作]
            map <leader>bd :Bclose<cr>:tabclose<cr>gT  " Close the current buffer
            map <leader>ba :bufdo bd<cr>               " Close all the buffers
            map <leader>bn :bnext<cr>
            map <leader>bp :bprevious<cr>
            map <leader>bf :bfirst<cr>
            map <leader>bl :blast<cr>

[ag查找]
            vnoremap <silent> gv :call VisualSelection('gv', '')<CR>    " block selected text for ag
            map <leader>g :Ag                                           " input text for ag
            map <leader>cc :botright cope<cr>
            map <leader>cq :cclose<cr>
            map <C-n> :cn<cr>
            map <C-p> :cp<cr>
            map <leader>co ggVGy:tabnew<cr>:set syntax=qf<cr>pgg

[tag切换]
            map 

[YouCompleteMe]
            map <leader>gd :YcmCompleter GoToDeclaration<cr>
            map <leader>gg :YcmCompleter GoToDefinition<cr>
            map <leader>gi :YcmCompleter GoToInclude<cr>
            map <leader>gf :YcmCompleter FixIt<cr>
            map <leader>ge :YcmDiags<cr>

[CTRL-P,ctrlp]
            let g:ctrlp_map = '<c-f>'
            map <leader>j :CtrlP<cr>
            map <c-b> :CtrlPBuffer<cr> 
            <c-d>                               " Toggle between full-path search and filename only search.
            <c-r>                               " Toggle between the string mode and full regexp mode.
            <tab>                               " Auto-complete directory names under the current working directory inside the prompt.
            <esc>, <c-c>, <c-g>                 " Exit CtrlP.

Moving:
            <c-j>, <down>                       " Move selection down.
            <c-k>, <up>                         " Move selection up.

            <c-a>                               " Move the cursor to the 'start' of the prompt.
            <c-e>                               " Move the cursor to the 'end' of the prompt.

            <c-h>, <left>, <c-^>                " Move the cursor one character to the 'left'. NOTE: secureCRT map <c-h> to <backspace>
            <c-l>, <right>                      " Move the cursor one character to the 'right'.

Editing:
            <c-w>                               " Delete a preceding inner word.
            <c-u>                               " Clear the input field.

Browsing input history:
            <c-n>                               " Next string in the prompt's history.
            <c-p>                               " Previous string in the prompt's history.

Opening/Creating a file:
            <cr>                                " Open the selected file in the 'current' window if possible.
            <c-t>                               " Open the selected file in a new 'tab'.
            <c-v>                               " Open the selected file in a 'vertical' split.
            <c-x>, <c-cr>, <c-s>                " Open the selected file in a 'horizontal' split.
            <c-y>                               " Create a new file and its parent directories.

[加速冒号命令(命令行)]
			<S-Left>,<C-Left>			        " 向左一个单词(我的键盘不行)
			<S-Right>,<C-Right>			        " 向右一个单词
			<c-b>,<Home>				        " 到命令行行首
			<c-e>,<End>				            " 到命令行行尾
			<c-w>					            " 删除光标之前的整个单词
			<c-u>					            " 删除光标之前的所有已键入的内容
			<c-c>,<Esc>				            " 放弃所有已经键入的命令
			<c-d>					            " 众多的补全候选项时，列出所有的候选
			:history					        " 查看所有的历史记录
			:history /					        " 查看搜索命令的历史记录
			q:							        " 打开命令行窗口(在Normal模式下),"hjkl"四处移动,回车执行该命令

[UltiSnips]
            let g:UltiSnipsExpandTrigger="<c-l>"
            let g:UltiSnipsJumpForwardTrigger="<c-j>"
            let g:UltiSnipsJumpBackwardTrigger="<c-k>"

            
[vim-multiple-cursors]
            let g:multi_cursor_next_key="<c-m>"
            let g:multi_cursor_prev_key="<c-p>"
            let g:multi_cursor_skip_key="<c-x>"
 
[vim-easy-align]
            vipga= " visual-select inner paragraph
                   " Start EasyAlign command (ga)
                   " Align around =
            gaip=  " Start EasyAlign command (ga) for inner paragraph
                   " Align around =

            xmap ga <Plug>(EasyAlign)
            nmap ga <Plug>(EasyAlign)
            vmap _  :EasyAlign*\<cr>       
            vmap +  :EasyAlign*=<cr>       
            vmap ,  :EasyAlign*,<cr>
            vmap &  :EasyAlign*&<cr>
            vmap .  :EasyAlign*.<cr>

            Example1
            Paul McCartney 1942
            George Harrison 1943
            Ringo Starr 1940
            Pete Best 1941

            <space>
            2<space>
            *<space>
            -<space>
            -2<space>
            <Enter><space>
            <Enter>*<space>
            <Enter><Enter>*<space>

            Example2
            a =
            a = 1
            bbbb = 2
            ccccccc = 3
            ccccccccccccccc
            ddd = 4
            eeee === eee = eee = eee=f
            fff = ggg += gg &&= gg
            g != hhhhhhhh == 888
            i   := 5
            i     %= 5
            i       *= 5
            j     =~ 5
            j   >= 5
            aa      =>         123
            aa <<= 123
            aa        >>= 123
            bbb               => 123
            c     => 1233123
            d   =>      123
            dddddd &&= 123
            dddddd ||= 123
            dddddd /= 123
            gg <=> ee

            =
            *=
            **=
            <Enter>**=
            <Enter><Enter>*=
[查找]
            vnoremap <silent> * :<C-u>call VisualSelection('', '')<CR>/<C-R>=@/<CR><CR>
            vnoremap <silent> # :<C-u>call VisualSelection('', '')<CR>?<C-R>=@/<CR><CR>

[去掉高亮]
            map <silent> <leader><cr> :noh<cr>

[粘贴模式]
            map <leader>pp :setlocal paste!<cr>

[vim-fugitive]
            :Gstatus
            :Gsdiff
[移动]
			w
			b
			e
			ge
			$,n$
			fx,nfx  		右移动到指定的字符X上
			Fx,nFx  		左移动到指定的字符X上
			ngg,ng
			H,M,L			"h"意为Home,Middle,Last	
			^				将光标移动到行首
			0				将光标移动到行首(顶格)
			CTRL-G			告诉你当前的位置
			``				两点之间来回跳转
			CTRL-O			跳转到更早时间光标的位置
			CTRL-I,<tab>	跳回到后来的更新的位置
			CTRL-]			转到当前光标之下的那个word所对应的链接中(查看help时)
			CTRL-T			(弹出标签)可以回到前一个位置,CTRL-O(跳转到较早的位置)也可以
			'1				回到你上次退出时的位置

[在代码块中移动]
			%				匹配一个括号 (#ifdef #else #endif)之间跳转
			[#				在"#if"-"#endif"结构的中间某个地方时,跳转到此结构的结束元素
			]#				在"#if"-"#endif"结构的中间某个地方时,跳转到此结构的开始元素
			[[				移动到一个代码块的开头
			][				移动到一个代码块的末尾
			[{				跳转到当前代码块的开头
			]}				跳转到当前代码块的末尾
			[]				查找上一个函数的结尾
			]]				查找下一个函数的开始

[注释内的移动]
			[/				移动到注释的开头(这只对/* - */形式的注释有效)
			]/				移动到注释的末尾

[标记]
			ma				将当前光标下的位置名之为标记"a"
			mb				将当前光标下的位置名之为标记"b"
			'a				跳转到前面定义的标记"a"
			'b				跳转到前面定义的标记"b"
			:marks			查看标记列表
							'	进行此次跳转之前的起跳点
							"	上次编辑该文件时光标最后停留的位置
							[	最后一次修改的起始位置
							]	最后一次修改的结束位置
			
[滚屏]
			CTRL-U			文本向下(窗口向上）滚动半屏
			CTRL-D			窗口向下移动半屏
			CTRL-E			向上滚动一行
			CTRL-Y			向下滚动一行
			CTRL-F			向前滚动一整屏
			CTRL-B			向后滚动一整屏
			zz				把当前行置为屏幕正中央
			zt				把当前行置于屏幕顶端
			zb				把当前行置于屏幕底端

[搜索]

			/+n,N			n向下，N向上  SHIFT + 3
			?+n,N
			#+n,N			光标先定位于待查找word上
			*+n,N
			:set incsearch	键入目标字符串同时开始搜索,回车跳转到当前匹配的位置 

[搜索模式]
			/XX$			查找行尾为XX
			/^XX			查找行首为XX
			/c.m			.可以匹配到任何一个字符

删除插入]	normal下													insert下
			cw,ce,c$       	操作以后进入插入模式						
			daw				删除一个文本对象(Delete A Word)				CTRL-W
			cas				修改一个句子(Delete a sentence)
			cis				修改一整个句子(Inner Sentence)
			d0				删除到行首的内容							CTRL-U
			c0				修改到行首的内容
			x			  	代表dl(删除当前光标下的字符)
			X			  	代表dh(删除当前光标左边的字符)
			D			  	代表d$(删除到行尾的内容)
			C			  	代表c$(修改到行尾的内容)
			s			  	代表cl(修改一个字符)
			S			  	代表cc(修改一整行)

[重复改动]
		例一：删除所有的<B>标签
			f< 				找到第一个 < --->
			df> 			删除到 >处的内容 -->
			f< 				找到下一个 < --------->
			. 				重复 df> --->
			f< 				找到下一个 < ------------->
			. 				重复 df> --> 除"u"命令CTRL-R和以冒号开头的命令。

		例二：把多次出现的"four"改为"five"
			/four<Enter> 	找到第一个字符串"four"
			cwfive<Esc> 	把它改为"five"
			n 				找到下一个字符串"four"
			. 				同样改为"five"
			n 				继续找下一个
			. 				做同样的修改			

[Visual block模式]
			{Visual}o					标置于被选中文本的另一头
			{Visual}I//<Esc><Esc>		块选后，在光标前的每行都加上"//"(其实只要一个<Esc>,这里有一个时间简陋)
			{Visual}A//<Esc><Esc>		块选后，在光标后的每行都加上"//"
			{Visual}$A//<Esc><Esc>	 	块选后，在每行的后面都添加上"//"
			{Visual}ctext<Esc><Esc>		块选后，修改块选内容为text
			{Visual}Ctext<Esc><Esc>		块选后，删除文本块边至每一行末尾的所有内容并修改为text
			{Visual}~ 					交换大小写 (a -> A, A -> a)
			{Visual}U 					将小写变大写 (a -> A, A -> A)
			{Visual}u 					将大写变小写 (a -> a, A -> a)
			{Visual}r					使整个文本块的内容全部以一个字符来填充
			{Visual}<,>					左右移动,移动的多寡由选项":set shiftwidth=4"指定
			{Visual}J					将多行内容以单空格连接起来,接后的句子结尾将被放两个空格
			{Visual}gJ					保留前导空白和后辍空白连接

			
[编辑多文件]
			:write,r main.c.html		当前文件另存为
			:write >> logfile			向文件中追加内容
			:edit! foo.txt				强制丢弃当前未保存的修改编辑新的文件
			:hide edit foo.txt			不想保存当前文件中的改动编辑另一个文件
			:set autowrite				自动存盘
			vim one.c two.c three.c		编辑多个文件
			vim `grep -l word *.c`		编辑所有包含了"word"的C文件
			:grep word *.c				列出包含"word"所有文件列表
			:next,n						编辑下一个文件
			:wnext,wn					保存并编辑下一个文件
			:previous,wp				回到前一个文件
			:last,first					移到最后(前)一个文件,不过没有":wlast"或者":wfirst"这样的命令
			:args five.c six.c seven.h	编辑另一个文件列表
			vim -R file					只读方式运行Vim
			ls | vim -					从标准输入读取
			
[缓冲区列表(buffer)]
			:hide edit two.txt			隐藏缓冲区
			:ls,buffers					显示缓冲区列表
							u			未被列出的缓冲区|unlisted-buffer|a
							%			当前缓冲区
							#			上一次的活动缓冲区
							l			被载入并显示在某窗口中的缓冲区
							h			被载入但隐藏的缓冲区。
							=			只读的缓冲区
							-			不可编辑的缓冲区，其中'modifiable'选项被关闭
							+			有改动的缓冲区
			:bn,buffern					打开第n个缓冲区
			:sbuffer,sb 3				在一个新窗口中打开一个缓冲区
			:bnext,bn					跳转到下一个缓冲区
			:bprevious,bp				跳转到前一个缓冲区
			:bfirst,bf					跳转到第一个缓冲区
			:blast,bl					跳转到最后一个缓冲区
			:bdelete,bd 3				删除一个缓冲区
			
[读写部分文件]
			:read,r filename			读入文件的内容就被放在当前行的后面
			:.,$write filename			写入指定范围行
			:.,$write! filename			如果文件"tempo"已经存在，覆盖它
			:.write filename			把当前行写入指定文件,"."表示作用范围只在当前行
			:.write >>filename			把当前行添加至指定文件
			{Visual}:write,w filename	选定文本定入指定文件
改变大小写
			guu,nguu					把n行都变为小写
			gUU,ngUU					把n行都变为大写
			guw,gUw						一个词中大小写变换
			~ 							改变当前光标下字符的大小写，并将光标移至下一个字符。

备份
			:set backup					备份文件名将是原文件名后面附加一个~
			:set backupext=.bak			指定默认的备份文件名后辍
			:set writebackup			成功地保存后备份文件就会被自动删除
			:set patchmode=.orig		第一次编辑保留的原始版为"*.orig",后续备份为"*.bak"。
分隔窗口
			:split,sp					分隔一个窗口
			vim -o 1.txt 2.txt 3.txt	为每一个文件打开一个窗口
			:all						进入vim后, 为指定的所有文件各开个水平窗口。
			:vertical all				进入vim后, 为指定的所有文件各开个垂直窗口。
			:close						关闭窗口,:close" 可以阻止你关闭最后一个Vim
			:only,on					关闭除当前窗口外的所有其它窗口
			:split,sp two.c				为另一个文件分隔出一个窗口
			:new						打开一个新窗口并开始编辑一个空的缓冲区
			:3split,sp alpha.c			打开了一个高度为3行的新窗口并在其中编辑名为alpha.c的文件
			CTRL-W +					增加当前窗口高度(先按^W,再按+)
			CTRL-W -					减小当前窗口高度
			:vsplit						垂直分隔,新窗口出现在当前窗口的左边
			:vertical new,vnew			垂直分隔窗口并在其中打开一个新的空缓冲区。
			:qall,qa					关闭所有打开的窗口
			:wall,wa					保存所有被修改的窗口
			:wqall						":qall"和":wall"的组合：保存并退出所有窗口
			:qall!						放弃所有修改强制退出Vim的命令,慎用！这一丢可就再也回不来了！
切换窗口
			CTRL-W h					到左边的窗口
			CTRL-W j					到下面的窗口
			CTRL-W k					到上面的窗口
			CTRL-W l					到右边的窗口
			CTRL-W t					到顶部窗口
			CTRL-W b					到底部窗口
移动窗口	
			CTRL-W K					向上移动窗口
			CTRL-W H					向左移动窗口
			CTRL-W J					向下移动窗口
			CTRL-W L					向右移动窗口

vimdiff查看不同
			vimdiff main.c~ main.c		打开二个窗口比较两个文件不同
			zo,zc						折叠栏位,"zo"展开折叠，"zc"把它们折起。
			:edit main.c				在编辑中进入diff模式
			:vertical diffsplit main.c
			:set noscrollbind			禁止同步滚动
			]c,[c						向上向下跳到不同之处
			:diffupdate					更改后更新对应的高亮显示,每次只起一次作用
			dp							"diff put"的缩写,将光标所在窗口中光标所指内容覆盖另一窗口中对应的内容
			do							意为"diff obtain",将另一窗口中对应的内容覆盖光标所在窗口中对应的内容

复制粘贴寄存器(register)
			"fyas						把一个句子复制到名为f的寄存器中(f 意为first)
			"l3Y						把3个整行的内容放到寄存器l中(l 意指line)
			CTRL-Vjjww"by				复制一个文本块到寄存器b中(b意为block)
			"wdaw						删除了一个word并把它保存在名为w的寄存器中
			"xp							复制内容寄存器(x=f,l,b,w...)至光标处。

命令(宏记录)的记录与回放(执行寄存器register)
			qa 							开始将后续的命令记入寄存器a
			^ 							将光标移动到行首
			i#include "<Esc> 			在该行之前插入#include "
			$ 							移动到行尾
			a"<Esc> 					在行尾加上"字符
			j 							移到下一行
			q 							停止记录
修改寄存器n
			G 							到文件最后
			o<Esc> 						生成一个新行
			"np 						将寄存器n的内容置于该行。你会看,到这些命令就象你键入的普通文本一样。
			{edits} 					修改错误的部分。这与编辑普通文本无异
			0 							到行首
			"ny$ 						将正确的结果回存到寄存器n中(复制寄存器n)
			dd 							删除这行草稿
			qC/word<Enter>q				寄存器c中追加内容(大写C),这种方式对命令记录和一般的yank，删除操作都有效。
			"aY							以小写来yank第一行
			"AY							移动到第二行,现在寄存器a就会包括所有这些行的内容。
替换
			nrx							替换n个字符
			:%s/Professor/Teacher/		替换文件中所有符合的目标字符串(":s"是":substitute"的缩写)
			:s/Professor/Teacher/g		替换一行中所有符合的目标字符串
			:1,5s/Professor/Teacher/g	替换1,5行中所有符合的目标字符串
			:%s/Professor/Teacher/c		替换前请求用户确认
			:%s/^the/these/				把行首的"the"替换为"these":
			:s+one/two+one or two+		如果替换字符串包含"/"，需前面加一反斜杠,可以用别的符号代替"/"
			:.,$s/yes/no/				替换当前行到最后一行中所有的yes为no,"%"范围指定符号，实际上等价于"1,$"。
			:?^Chapter?,/^Chapter/s=grey=gray=g		替换本章中所有 的"grey"为"gray"。
										使用搜索模式来指定作用范围:
										第一个"?^Chapter?" 向后查 找，"/^Chapter/"向前。为了避免眼花
										liao乱的斜杠/, ":s"命令使 用"="字符作为分隔符。
			:'t,'bs/yes/no				使用标记来指定作用范围
			:'<,'>						Visual模式下选定文本后按下":"，表示只对选定的范围进行操作。
			:%s/\s\+$//					消除多余空格
			:g/^\s*$/d                  删除包括空白，Tab，空白和Tab交错的所有空行.(^是行的开始，\s*是零个或者多个空白字符；$是行尾)

替换多个文件中的目标
			vim *.cpp					打开所有的C++文件。编辑第一个文件。
			qq 							开始宏记录，将后续的操作记录在名为q的宏中。
			:%s/\<GetResp\>/GetAnswer/g	在第一个文件中执行替换操作。
			:wnext 						保存该文件并转到下一个文件进行编辑
			q 							停止宏记录
			@q 							执行名为q的宏。执行前面的替换操作和":wnext。你可以看看整个过程是否有错误。
			999@q 						对其余文件执行同样的操作
			
			:%s/\<GetResp\>/GetAnswer/ge	如果其中一个.cpp文件中连一个"GetResp"都没有， 替换操作会引起一个错误
											整个宏的执行也会被停下来。标志"e"可以消除这一副作用 
			:%s/\([^,]*\), \(.*\)/\2 \1/	将"Last, First"改为"First Last"

外部程序
			!5Gsort<Enter>				将前5行排序,"!"表示执行一个过滤操作
			!!date<Enter>				"date"命令的输出来替换当前行的内容。"!!"命令过滤当前行的内容。
			{Visual}!{filter}			过滤块选的内容
			{Visual}!sort				对块选内容排序
			:%!nl						对所有的非空行进行编号
			:%!nl -ba					对包含空行的所有行进行编号
			:%s/^\+[0-9]\+//			删除前面的行号
			:read,r !ls					读取命令的输出
			:0read !date -u				在文件开头插入UTC格式的当前日期时间
			:write !wc					统计当前文件中的单词数(将文本写入一个命令)
			:write! wc					强制覆盖当前目录下的"wc"。这里的空白至关重要！
			CTRL-L						重绘屏幕

全局命令
			:[range]global/{pattern}/{command}		允许你找到符合某个匹配模式的行然后将命令作用其上。
			:g+//+s/foobar/barfoo/g		把C++注释中所有"foobar"替换为"barfoo",":g"是":global"的缩写
			:g/^/m 0					反转行序。|:g|与|:move|结合起来将所有行移到第一行的前面
										"^"这个正则表达式匹配一行的开头(即使该行是空行也可匹配到).
			{Visual}:g/^/m '<			对选定内容反转行序
										
统计字数
			g CTRL-G					统计整编文章字数
			{Visual}g CTRL-G			统计选定行的字数

查找帮助页(help)(man)
			:source $VIMRUNTIME/ftplugin/man.vim	首先运行man对应的文件类型plugin
			\K							显示当前光标所在字对应的man页
			

VIM共享viminfo
			:wviminfo! ~/backup/viminfo	在第一个Vim保存
			:rviminfo! ~/backup/viminfo	在另一个中读取
会话(session)
			:mksession ~/.vim/vihelp.vim创建一个会话文件
			:source ~/.vim/vihelp.vim	恢复到此前的会话状态
			vim -S vimbook.vim			在shell中启动Vim时恢复某个会话,'S'代表session

										当前"secret"项目，切换到"boring"项目
			:wall						保存所有被改动的文件。
			:mksession! ~/.vim/secret.vim保存当前的会话
			:source ~/.vim/boring.vim	切换到新的"boring"会话。

会话和VIMINFO(会话能保存很多信息，但是不包括标记，寄存器和命令历史记录。)
			:mksession! ~/.vim/secret.vim		同时保存会话和viminfo。
			:wviminfo! ~/.vim/secret.viminfo
			:source ~/.vim/secret.vim			同时恢复会话和viminfo
			:rviminfo! ~/.vim/secret.viminfo

简单的映射
			:map						 Normal, Visual and Operator-pending
			:vmap						 Visual
			:nmap						 Normal
			:omap						 Operator-pending
			:map!						 Insert and Command-line
			:imap						 Insert
			:cmap						 Command-line
			
			:map							列出映射
			:unmap							删除一个映射
			:map <F5> i{<Esc>ea}<Esc>		把某些词以花括号括起来,把光标置于该word 的首字符上
			:map \p i(<Esc>ea)<Esc>			反斜杠也是一个可用于映射的字符,(记住动作要快点)！
			:map \c i{<Esc>ea}<Esc>
			:map \" i"<Esc>ea"<Esc>
			:imap \i iif<Space>()<Space>{<Enter>}<Enter>else<Space>{<Enter>}  插入if-else(自定义)
			:map <F2> GoDate: <Esc>:read !date<CR>kJ  在文章下边插入日期
			:imap <F2> Date: <Esc>:read !date<CR>kJA  insert模式下在当前光标处插入日期,Normal<F2>映射不受影响
			:map <F5> <Esc>:make<Enter>
			:map <F6> <Esc>:make clean<Enter>
			:vmap <F7> :s/^/> <CR>:noh<CR>``        插入">"注释
			:vmap // :s/^/\/\/<CR>:noh<CR>``		插入"/"注释
			:nmap <C-F> "ipVjjjjj=lllli				将寄存器i中的内容定义为map.(i中包含if else)
			:imap \i <Esc>"ipVjjjjj=lllli			将寄存器i中的内容定义为map.(i中包含if else)
			:imap \p printf("\n"<Esc>A;<Esc>hhhhi	输出printf("\n");
			:nmap + ggVG=<C-O><C-O>					格式化代码
			:map Q gq								格式化注释
			:inoremap () ()<Left>					插入"()"时,光标回退
			:inoremap /** /**/<Left><Left>			插入"/**/",光标回退
			:inoremap {} {<CR>}<Esc>O				插入"{}}时,光标回退
			:inoremap <C-D> <Esc>ddi				插入模式下删除
			:inoremap <C-U> <Esc>ui					插入模式下撤销
			:inoremap <C-R> <Esc><C-R>i				插入模式下恢复
			:inoremap \i <Esc>"ipVjjjjj=lllli		
			:inoremap \p printf("\n");<Esc>hhhhi
			:inoremap <C-K> <Up>
			:inoremap <C-J> <Down>
			:inoremap <C-H> <Left>
			:inoremap <C-L> <Right>
			:inoremap <C-O> <Esc>o


常用选项
			:set incsearch "键入目标字符串同时开始搜索,回车跳转到当前匹配的位置
			:set showcmd "在Vim窗口的右下角显示一个完整的命令已经完成的部分。
			:set nowrap    		不要折行
			:set sidescroll=10	
			:set whichwrap=b,s	跨行移动命令
			:set whichwrap=b,s,<,>
			:set list			查看制表符
			:set listchars=tab:>-,trail:-
			:set iskeyword		查看关键字
			:set iskeyword+=-	把连字符也视为word的一部分
			:set iskeyword-=_	移走下划线
			:set cmdheight=3	信息显示区,默认为一。
			:syntax enable		打开色彩
			:syntax clear		关闭语法高亮
			:set filetype=c		手工指定文件的类型
			:set filetype=cpp   C++
			#vim: syntax=vim   指定该文件语法高亮类型,注意#号后要有一个空格
			:set background=dark,light  选定亮色背景
			:source $VIMRUNTIME/syntax/2html.vim    把当前文件转到HTML格式
			:set ignorecase		忽略大小写
			:set ignorecase smartcase		若搜索内容中至少包括一个大写字母，搜索就大小写敏感。

			"omnifunc自动补全。但typedef不起作用,还要有tags的支持，且要设为绝对路径
			autocmd Filetype c set omnifunc=ccomplete#Complete 

模式行(modeline)
			/* vim:set shiftwidth=4: */			C程序中，把缩进量设为4个空格
			:set modelines=10	控制Vim前后检查多少行来找出模式行
			// vim:set textwidth=72 dir=c\:\tmp: use c:\tmp here  另一个例子
文件浏览器(netrw)
			:edit .				在光标所在文件上按<Enter>打开该文件进行编辑。CTRL-O返回。"-"当前目录的父目录
			
			下面的命令用于选择文件进行预览或编辑: (前提是光标位于文件名上)
			<Enter> 			在当前窗口中打开文件 |netrw-cr|
			o					打开一个水平分隔的窗口显示文件 |netrw-o|
			v					打开一个垂直分隔的窗口显示文件 |netrw-v|
			p					使用|preview-window|窗口 |netrw-p|
			p					在|preview-window|窗口中编辑 |netrw-P|
			t					在一个新标签页中打开文件 |netrw-t|
			
			下面的命令控制netrw浏览器插件显示的信息:
			i					 控制列表显示的风格(仅文件名, 还是在一行中显示详细信息,
								 逐行列出项目, 还是树形显示), 其中详细信息风格包括文件大小和日期信息
			s					 重复按s会循环改变文件排序的方式: 按文件名排序, 按最后修改时间,
								 或者根据文件大小.
			r					 切换正反向排序

			下面是几个normal模式命令的额外例子:
			c 将当前目录切换到浏览器正打开的目录。(请参考|g:netrw_keepdir|对此进行控制)
			d 创建一个directory
			R 更改当前光标下的文件，Vim会提示你输入一个新的文件名(不支持目录更名)
			D 删除当前光标下的文件名。 Vim也会提示你进行确认
当前目录
			:pwd
			/home/Bram/VeryLongFileName
			:cd /etc
			:pwd
			/etc
			:cd -						设定上次工作目录为当前工作目录
			:pwd
			/home/Bram/VeryLongFileName
			:cd -
			:pwd
			/etc
多个窗口使用多个工作目录
			:pwd
			/home/Bram/VeryLongFileName
			:split
			:lcd /etc
			:pwd
			/etc
			CTRL-W w
			:pwd
			/home/Bram/VeryLongFileName

查找一个文件
			gf,[f,]f					查找光标处文件名的文件,在当前窗口打开
			CTRL-W f					在另一窗口中打开查找的文件
			:set path+=c:/prog/include	设置查找绝对路经
			:set path+=./proto			设置查找相对路经
			:find inits.h				若查找的文件名并没有出现在当前文件中，但确知其名字，可以这样查找它
			vim "+find stdio.h"			编辑一个位于'path'中的文件
定位include文件
			:checkpath					(从path中)列出所有不能找到的include文件
			:checkpath!					(从path中)列出所有能找到和不能找到的include文件

加密文件
			vim -x exam.txt				新编辑一个加密文件
			:set key=					停止一个文件加密，可以把'key'选项设置为一个空字串
			:X							对当前编辑文件设置加密密码
自动补全
			CTRL-X CTRL-F				文件名
			CTRL-X CTRL-L				整行内容
			CTRL-X CTRL-D				宏定义(也包括那些在include文件里定义的宏)
			CTRL-X CTRL-I				当前文件和被当前文件include的文件
			CTRL-X CTRL-K				来自一个字典文件的word
			CTRL-X CTRL-T				来自一个thesaurus的word
			CTRL-X CTRL-]				tags
			CTRL-X CTRL-V				Vim的命令行
程序源码中的自动补全
			CTRL-X CTRL-O				补全"->" "."		ft-c-omni
			CTRL-A						插入上一次在insert模式下录入的内容
			CTRL-Y						插入当前光标之上的一行中相同位置字符
			CTRL-E						插入当前光标之下的一行中相同位置字符
手工折行
			zfap						创建折行
			zo							打开折行
			zr							逐个打开
			zc,zM						关闭折叠
			zm							逐个关闭

			:set foldcolumn=4			使用折行
			zO							打开所有折叠
			zC							关闭所有折叠
			zd							删除当前行的折叠
			zD							删除当前行的所有折叠

根据缩进的折行
			:set foldmethod=indent		根据缩进的折行
			zr							逐个打开
			zm							逐个关闭

			:set foldmethod=marker		根据标记的折行

使用tags
			CTRL-]						前跳
			CTRL-T						后跳
			CTRL-W ]					在新窗口中往前跳
			CTRL-W T					在新窗口中往后跳
			ctags -R -f ~/.vim/systags /usr/include /usr/local/include 创建tag
			:set tags=./tags,./../tags,./*/tags	使用当前目录，上一级目录，当前目录下所有层级子目录下的tags文件。
			:ptag write_char			预览窗口
			:pclose						关闭预览窗口
			
tags的浏览器
			ctags --c-types=f -f functions *.c 建立一个标识符的列表
			:vsplit functions			以一个垂直分隔窗口的编辑命令打开生成的文件
			:nnoremap <buffer> <CR> 0ye<C-W>w:tag <C-R>"<CR>		定义这样的一个映射
										把光标移到要查的函数上，按回车在另一个窗口中定位到该函数定义上。
查找(定义)全局标识符
			[<Tab>,[ CTRL-I				跳转到(定义)全局标识符,CTRL-I等同于<Tab>。
			[I							列出包括include里边所有匹配定义及其对应的文件与相应的行
			[i							列出包括include里边第一个匹配定义及其对应的文件与相应的行
			]I							列出本文件中光标以下所有匹配定义与相应的行
			]i							列出本文件中光标以下第一个匹配定义与相应的行
			[D							列出所有匹配的宏定义与相应的行
			[d							只列出第一个匹配
			]D							只列出当前光标之后的匹配
			]d							只列出当前光标之后的第一个匹配。
查找(定义)局部标识符(跳转)
			gD							goto Definition。这对查找一些静态的变量或函数很有用处。
			gd							在当前函数里查找

编译(make)
			:make {arguments}			若有错误(警告)产生，回车将会自动将光标定位于第一个错误(警告)的事发地点。
			:make clean -C lib/
			:cnext,cn					跳转到下一个错误(警告)的事发地点
			:cprevious,cp				要回到前一个错误(警告)
			:cfirst						到第一个错误处(警告)
			:clast						到最后一个错误处(警告)
			:cc							查看当错误信(警告)息
			:cc 3						到第3个错误处(警告)
			:clist,cl					以特殊颜色列出当前所有的错误
			:colder,再:clist			回到前一个错误列表
			:cnewer,再:clist			回到后一个错误列表
			:copen						打开快速修订窗口，在其中显示所有错误，可在错误按回车键跳转至该错误

C程序的(自动)缩进(cindent)
			:filetype indent on			检查文件类型,打开cindent选项
			:set filetype				检测当前文件类型
			:set cindent shiftwidth=4
			==							调整一行
			{Visual}=					对所选区域调整
			=a{,=a}						调整一代码块
			=gg							调整光标前区域
			=G							调整光标后区域
			gg=G						调整整个文件
			>i{,>i},<i{,<i}				为{}内的所有行增加一个缩进单位
			>a{,>a},<a{,<a}				包括了{ 与}所在的行本身

对注释的格式化
			gq]/						光标置到注释的开始."gq"是格式化命令操作符。"]/"移到注释结尾命令。
			{Visual}gq					
gdb调试
			set args <arg list>			设置命令行参数
			show args					查看命令行参数
			step,s						step in
			next,n						step out
			finish						运行到函数返回
			until						运行到某一行

			print /x,d,  $eax,ebp
			x    /x  $eax,...
			info     registers
			x /42cb &output             显示特定内存位置的值,相应字段表示:长度,进制,单位长度
			
			break *_start+1

设置断点
			break SampleChildClass::PrintMe函数入口处暂停
			break foo(int)
			break foo(int,int
			break test.cc:foo(int) 		在某个文件中的某一函数处
			break test.cc:11			在某个文件中的某一行
			break *0x80485ba			在某一内存地址处
			tbreak 						临时断点，只用一次
			hbreak						硬件辅助断点
			thbreak						tbreak与hbreak的复合
			rbreak						后面的参数是一个正则表达式
			info break,breakpoints		查看断点
			enable delete Number		起动断点，一旦在断点处暂停，就删除断点，
										Number表示断点号，不是行号，可以多个，用空格分隔
			enable once   Number		只起动一次断点，暂停后就关闭
			delete,d breakpoints,b N	删除断点，可以多个用空格分隔
			info sources				查看源文件信息
vim中运行bash
			:ConqueTermSplit bash
注释风格
/*-------------------------------add by me -------------------------------------
 * NAND flash settings
 */
/* ---------------------------------end----------------------------------------- */

Makefile 模板
# 主工程目录
PROJDIR = .
OBJSDIR = $(PROJDIR)/objs
INCSDIR = $(PROJDIR)/include

# 子工程目录
CSRCDIR   = $(PROJDIR)/csrc
CPPSRCDIR = $(PROJDIR)/cppsrc


SRCS  += $(wildcard *.c)
OBJS  := $(addprefix $(OBJSDIR)/, $(addsuffix .o, $(basename $(notdir $(SRCS)))))
INCS  += -I$(INCSDIR) -I$(CPPSRCDIR)/include

STATICLIBS += $(CPPSRCDIR)/lib/libfunc_c++.a
STATICLIBS += $(CSRCDIR)/lib/libfunc_c.a

CC = gcc 
CFLAGS  += $(INCS)

# gcc链接g++编译成的库时一定要加-lstdc++,因为g++编译成的库调用的的stdc++库
LDFLAGS += $(STATICLIBS) -lstdc++ 


EXENAME = c_call_cpplib_test
DEPFILE = deps

.PHONY:all
all: $(DEPFILE)  $(EXENAME)


$(DEPFILE): $(SRCS) Makefile
	@echo "Generating new dependency file...";
	@-rm -f $(DEPFILE)
	@for f in $(SRCS); do \
		OBJ=$(OBJSDIR)/`basename $$f|sed -e 's/\.cpp/\.o/' -e 's/\.c/\.o/'`; \
		echo $$OBJ: $$f >> $(DEPFILE); \
		echo '	$(CC) $$(CFLAGS) -c -o $$@ $$^'>> $(DEPFILE); \
		done

-include $(DEPFILE)
$(EXENAME): $(OBJS)
	$(MAKE) -C $(CPPSRCDIR)
	$(MAKE) -C $(CSRCDIR)
	$(CC) $(CFLAGS)  $(OBJS) -o "$@" $(LDFLAGS)
	$(CROSS_COMPILER)strip $(EXENAME)
	cp $(EXENAME) $(PROJDIR)/release

.PHONY:clean
clean:
	$(MAKE) -C $(CPPSRCDIR) clean
	$(MAKE) -C $(CSRCDIR) clean
	rm -fr $(OBJSDIR)/*.o
	rm -fr $(DEPFILE)
	rm -fr $(EXENAME)

// vim:syntax=vim
